home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 235_02 / ovview.c < prev    next >
Text File  |  1987-06-16  |  24KB  |  696 lines

  1. /*  028  11-Jan-87  ovview.c
  2.  
  3.         Copyright (c) 1987 by Blue Sky Software.  All rights reserved.
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <fcntl.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include "ov.h"
  11.  
  12. #define H_bar (0xcd)
  13. #define V_bar (179)
  14.  
  15. #define Vnextch(fh) ((curp < endp) ? *curp++ : vnextch(fh))  /* speed up */
  16. #define Vprevch(fh) ((curp > bufp) ? *--curp : vprevch(fh))  /* buffer access */
  17.  
  18. extern unsigned char far *curp;                /* current char position */
  19. extern unsigned char far *bufp, far *endp;     /* buffer begin/end pointers */
  20.  
  21. static int (*mark_func)();             /* pointer to marker function */
  22. static int nlines;                     /* # lines displayed on screen */
  23. static unsigned char ascmode;          /* true means ascii mode display */
  24. static unsigned char bitmask;          /* for 7 or 8 bit display mode */
  25. static int inf;                        /* handle for file being viewed */
  26. static int margin;                     /* margin for right/left scrolling */
  27. static long tos;                       /* top of screen offset in file */
  28. static long markers[5];                /* marker positions  */
  29.  
  30. /* function delcarations created by -Zg option - ALTCALL added
  31.    NOTE: anything called by menu routine cannot be ALTCALL */
  32.  
  33. /*global*/  int view(void);
  34. /*global*/  int view_move(int );
  35. static int view_exit(void), view_down(void), view_up(void), view_next(void);
  36. static int view_prev(void), view_tof(void), view_eof(void);
  37. static int view_right(void), view_left(void), view_set(void), view_goto(void);
  38. static int do_mark(void), setmark(void), gomark(void), ALTCALL view_line(void);
  39. static int ALTCALL fmt_asc_line(char *,int *), ALTCALL fmt_hex_line(char *,int *);
  40. static int view_7bit(void), view_8bit(void), view_asc(void), view_hex(void);
  41. static int ALTCALL align(void);
  42. static int ALTCALL backup(int );
  43. static int ALTCALL peol(void);
  44. static int ALTCALL nsol(void);
  45. static int ALTCALL more2view(void);
  46.  
  47. static struct key_ent {        /* table mapping movement keys to function */
  48.    int key;
  49.    int (*func)();
  50. } key2func[] = { { DOWN, view_next }, { UP, view_prev }, { PGDN, view_down },
  51.    { PGUP, view_up }, { HOME, view_tof }, { END, view_eof },
  52.    { RIGHT, view_right }, { LEFT, view_left } };
  53.  
  54. #define NMOVKEYS (8)
  55.  
  56. extern MENU_STATE curmenu;
  57. extern MENU top_file_menu[], *top_menu;
  58.  
  59. static char setgo[] = "Set/Goto marker";
  60.  
  61. static MENU mark_menu[] = {
  62.    { "1", setgo, do_mark, NULL },
  63.    { "2", setgo, do_mark, NULL },
  64.    { "3", setgo, do_mark, NULL },
  65.    { "4", setgo, do_mark, NULL },
  66.    { "5", setgo, do_mark, NULL },
  67.    { NULL, NULL, NULL, NULL }
  68. };
  69.  
  70.  
  71. MENU top_view_menu[] = {
  72.    { "Dwn", "Page down in the file", view_down, NULL },
  73.    { "Up", "Page up in the file", view_up, NULL },
  74.    { "Nxt", "Advance one line", view_next, NULL },
  75.    { "Prv", "Backup one line", view_prev, NULL },
  76.    { "TOF", "Goto Top Of File", view_tof, NULL },
  77.    { "EOF", "Goto End Of File", view_eof, NULL },
  78.    { "Rght", "Scroll right 8 characters", view_right, NULL },
  79.    { "Left", "Scroll left 8 characters", view_left, NULL },
  80.    { "Set", "Set marker at current position", view_set, mark_menu },
  81.    { "Goto", "Goto set marker position", view_goto, mark_menu },
  82.    { "Ascii", "View file as ASCII characters", view_asc, NULL },
  83.    { "Hex", "View file in hexadecimal", view_hex, NULL },
  84.    { "7bit", "View low 7 bits of each character", view_7bit, NULL },
  85.    { "8bit", "View all 8 bits of each character", view_8bit, NULL },
  86.    { "Quit", "Return to file display", view_exit, top_file_menu },
  87.    { NULL, NULL, NULL, NULL }
  88. };
  89.  
  90. extern WINDOW cw;
  91. extern char *cantopen;
  92. extern FILE_ENT files[];
  93. extern unsigned char view_display, restricted;
  94.  
  95. int ALTCALL vbuf_init(int );           /* declarations for buffer routines */
  96. int ALTCALL vbuf_free(void);
  97. unsigned long ALTCALL vtell(void);
  98. int ALTCALL vseek(int ,long ), ALTCALL vnextch(int ), ALTCALL vprevch(int );
  99.  
  100. #define view_seek(off) vseek(inf,off)
  101.  
  102.  
  103. /******************************************************************************
  104.  **                             V I E W                                      **
  105.  *****************************************************************************/
  106.  
  107. view() {               /* view the current file at the terminal */
  108.  
  109.    int i;
  110.    register char *fn;
  111.    register FILE_ENT *fp;
  112.  
  113.    /* don't try to view file if its empty */
  114.  
  115.    fp = &files[cw.curidx];             /* a couple of quick pointers */
  116.  
  117.    if (fp->size == 0)
  118.       show_error(0,8,1,"This file is empty!");
  119.  
  120.    bitmask = 0xff;             /* defaults: 8 bit, ascii, left edge */
  121.    ascmode = TRUE;
  122.    margin = 0;
  123.  
  124.    /* open the file to be viewed, error out if can't open */
  125.  
  126.    if ((inf = open((fn = fname(fp)),O_RDONLY|O_BINARY)) == -1) {
  127.       free(fn);
  128.       show_error(1,8,3,cantopen,fp->name,": ");
  129.    }
  130.  
  131.    savescreen();               /* save current display image */
  132.    restricted = TRUE;          /* disable special file commands */
  133.    view_display = TRUE;        /* yes, we are viewing */
  134.  
  135.    for (i = 0; i < 5; i++)     /* set markers to TOF */
  136.       markers[i] = 0L;
  137.  
  138.    vbuf_init(inf);             /* initialize view buffer system */
  139.  
  140.    center_text(FIRST_VROW-1,fn); /* show file name */
  141.    free(fn);
  142.  
  143.    view_down();                /* display the first screen of file data */
  144.  
  145.    top_menu = top_view_menu;   /* setup the view menu as the main menu */
  146. }
  147.  
  148.  
  149. /******************************************************************************
  150.  **                        V I E W _ E X I T                                 **
  151.  *****************************************************************************/
  152.  
  153. static int
  154. view_exit() {          /* exit the view display, return to file display */
  155.  
  156.    close(inf);                 /* close file */
  157.    vbuf_free();                /* release memory */
  158.    top_menu = top_file_menu;   /* restore file menu as main */
  159.  
  160.    restricted = FALSE;         /* all commands are enabled */
  161.    view_display = FALSE;       /* not viewing */
  162.  
  163.    restorescreen();            /* redisplay prior screen image */
  164. }
  165.  
  166.  
  167. /******************************************************************************
  168.  **                        V I E W _ D O W N                                 **
  169.  *****************************************************************************/
  170.  
  171. static int
  172. view_down() {          /* page down into the view buffer/file */
  173.  
  174.    register int i;
  175.  
  176.    if (!more2view())           /* nothing to do if no more data to view */
  177.       return;
  178.  
  179.    nlines = 0;                 /* no lines displayed yet */
  180.    tos = vtell();              /* remember where top of screen is */
  181.  
  182.    /* display up to a screen full of file data, clear the screen as we go */
  183.  
  184.    for (i = 0; i < VIEW_ROWS; i++) {
  185.       gotorc(i+FIRST_VROW,0);          /* position to line */
  186.       if (view_line())                 /* display a single line */
  187.          nlines++;                     /* count lines displayed */
  188.    }
  189. }
  190.  
  191.  
  192. /******************************************************************************
  193.  **                        V I E W _ U P                                     **
  194.  *****************************************************************************/
  195.  
  196. static int
  197. view_up() {            /* page up into the view buffer */
  198.  
  199.    long curoff;
  200.  
  201.    /* back two screen's worth, or to the top line in memory and use
  202.       view_down() to display the screen - only display if we really
  203.       backed up (might be at TOF) */
  204.  
  205.    curoff = vtell();                   /* where we were */
  206.    view_seek(tos);                     /* quickly to top of screen */
  207.    if (backup(VIEW_ROWS))              /* try to backup another screen */
  208.       view_down();                     /* display prior screen if backed up */
  209.    else
  210.       view_seek(curoff);               /* must be tof, back to where we were */
  211. }
  212.  
  213.  
  214. /******************************************************************************
  215.  **                        V I E W _ N E X T                                 **
  216.  **********************************